1 Domain problem formulation

What is the real-world question? This could be hypothesis-driven or discovery-based.

Some advice


Why is this question interesting and important? What are the implications of better understanding this data?


Briefly describe any background information necessary to understand this problem.

Some advice


Briefly describe how this question can be answered in the context of a model or analysis.


Outline the rest of the report/analysis.


2 Data

What is the data under investigation? Provide a brief overview/description of the data.


Describe how your data connects to the domain problem.


2.1 Data Collection

How was the data collected or generated (including details on the experimental design)? Be as transparent as possible so that conclusions made from this data are not misinterpreted down the road.


Describe any limitations when using the data to answer the domain problem of interest.


Where is the data stored, and how can it be accessed by others (if applicable)?


2.2 Data Splitting

TODO: add advice for possible data splits, AK getting nice figure together

Decide on the proportion of data in each split.

Decide on the “how” to split the data (e.g., random sampling, stratified sampling, etc.), and explain why this is a reasonable way to split the data.


Split the data into a training, validation, and test set.

data_split <- dataSplit(X = X, y = y, stratified_by = y,
                        train_prop = params$train_prop, 
                        valid_prop = params$valid_prop, 
                        test_prop = params$test_prop)
Xtrain <- data_split$X$train
Xvalid <- data_split$X$validate
Xtest <- data_split$X$test
ytrain <- data_split$y$train
yvalid <- data_split$y$validate
ytest <- data_split$y$test

Provide summary statistics and/or figures of the three data sets to illustrate how similar (or different) they are.


2.2.1 Data Splitting Overview

X Data Split

plotDataSplit(Xtrain, Xvalid, Xtest, 
              xlab = "X", title = "Overall X Distribution")

Y Data Split

plotDataSplit(ytrain, yvalid, ytest, 
              xlab = "y", title = "Overall y Distribution")

2.3 Data Cleaning and Preprocessing

What steps were taken to clean the data? More importantly, why was the data cleaned in this way?

Discuss all inconsistencies, problems, oddities in the data (e.g., missing data, errors in data, outliers, etc.).

Record your preprocessing steps in a way such that if someone else were to reproduce your analysis, they could easily replicate and understand your steps.

It can be helpful to include relevant plots that explain/justify the choices that were made when cleaning the data.

If more than one preprocessing pipeline is reasonable, examine the impacts of these alternative preprocessing pipelines on the final data results.

Again, be as transparent as possible. This allows others to make their own educated decisions on how best to preprocess the data.


## DO DATA CLEANING / PRE-PROCESSING HERE 
Xtrain <- log(Xtrain + 1) %>%
  removeConstantCols(verbose = 1) %>%
  removeDuplicateCols(verbose = 1) %>%
  filterColsByVar(max_p = 1000)
#> Removed 296 features with constant values
#> Removed 5 features that are duplicated
Xvalid <- log(Xvalid + 1)[, colnames(Xtrain)]
Xtest <- log(Xtest + 1)[, colnames(Xtrain)]

2.4 Data Exploration

TODO: Add drag and drop feature in shiny version for other images

The main goal of this section is to give the reader a feel for what the data “looks like” at a basic level.

Provide plots that summarize the data and perhaps even plots that convey some smaller findings which ultimately motivate the main findings.

Provide additional plots representing remaining oddities after pre-processing if applicable.

Add summary statistics in accompanying tables (or in figures) for quick comparisons.


2.4.1 Data Overview

#> Number of features: 1000
#> Number of training samples: 649
#> Number of validaiton samples: 216
#> Number of test samples: 218
# summary of types of features in (X, y) data
dataTypes(X = Xtrain, y = ytrain)

Summary Tables

# broad array of summary statistics for features in training (X, y)
tab_ls <- dataSummary(X = Xtrain, y = ytrain)
for (dtype in names(tab_ls)) {  # grouped by data type
  simChef:::subchunkify(tab_ls[[dtype]], i = chunk_idx, 
                        other_args = "results='asis'")
  chunk_idx <- chunk_idx + 1
}

X Distribution

# plot X distribution
plotDataDistribution(data = Xtrain, 
                     xlab = "X", title = "Training X Distribution")

Y Distribution

# plot y distribution
plotDataDistribution(data = ytrain, 
                     xlab = "y", title = "Training y Distribution")

Data Heatmap

# (clustered) heatmap of (X, y) data
plotDataHeatmap(X = Xtrain, y = ytrain, clust_rows = TRUE, clust_cols = TRUE,
                show_ytext = FALSE, x_text_angle = TRUE)

Feature Correlation

# (clustered) correlation heatmap
plotCorHeatmap(X = Xtrain, cor_type = "pearson", clust = TRUE,
               x_text_angle = TRUE) +
  ggplot2::labs(x = "Features", y = "Features", fill = "Cor.")

Feature Pair Plots

# feature pair plot (for a subset of features)
keep_features <- sort(
  sample(1:ncol(Xtrain), min(ncol(Xtrain), 6), replace = FALSE)
)
plotPairs(data = Xtrain, columns = keep_features, 
          color = ytrain, color_label = "y")

Marginal Associations

# marginal association plots (for a subset of features)
caret::featurePlot(x = Xtrain[, keep_features],
                   y = ytrain,
                   plot = if (is.factor(ytrain)) "box" else "scatter",
                   scales = list(x = list(relation = "free"), 
                                 y = list(relation = "free")))

PCA

# pca plot
plotPCA(X = Xtrain, npcs = 3, color = ytrain, color_label = "y",
        center = TRUE, scale = FALSE)$plot

3 Prediction Modeling

TODO: add advice on which models to select and why

Discuss the prediction methods under consideration, and explain why these methods were chosen.


Discuss the accuracy metrics under consideration, and explain why these metrics were chosen.


Note: there should be multiple methods and metrics under consideration to paint a more holistic picture of the data. At least one method should be a baseline, common approach that may not be optimal for the problem setting, but serves as a helpful comparison.

3.1 Prediction check

Carry out the prediction pipeline, outlined above.

  1. Fit prediction methods on training data.
  2. Evaluate prediction methods on validation data.
  3. Compare results, and filter out poor models.


## IF USING TIDYMODELS BACKEND, CHOOSE METHODS AND TRAINING CONTROLS HERE
cv_options <- list(nfolds = 5,
                   foldids = NULL,
                   metric = "accuracy")

model_list <- list(
  rand_forest = list(.tune_params = list(mtry = round(seq(sqrt(ncol(Xtrain)),
                                                          ncol(Xtrain) / 3,
                                                          length.out = 3))),
                     engine = list(engine = "ranger",
                                   importance = "impurity")),
  boost_tree = list(engine = "xgboost")
)
# fit/train models
fit_results <- fitModels(Xtrain = Xtrain, ytrain = ytrain,
                         model_list = model_list, cv_options = cv_options,
                         use = params$modeling_pkg)
#> [10:30:56] WARNING: amalgamation/../src/learner.cc:1115: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'multi:softprob' was changed from 'merror' to 'mlogloss'. Explicitly set eval_metric if you'd like to restore the old behavior.

# make prediction on validation set
pred_results <- predictModels(fit_list = fit_results, Xtest = Xvalid)

# evaluate predictions on validation set
eval_results <- evaluateModels(pred_df = pred_results, ytest = yvalid)

# collect feature importance metrics from model fits
imp_results <- interpretModels(fit_list = fit_results)

Fit Summary

rand_forest

#> Fitting time taken: 2.53457261721293 min
#> 
#> =====================================================
#> ================ Tuned Model Summary ================
#> =====================================================
#> 
#> ══ Workflow [trained] ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
#> Preprocessor: Formula
#> Model: rand_forest()
#> 
#> ── Preprocessor ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
#> .y ~ .
#> 
#> ── Model ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
#> Ranger result
#> 
#> Call:
#>  ranger::ranger(x = maybe_data_frame(x), y = y, mtry = min_cols(~182,      x), importance = ~"impurity", num.threads = 1, verbose = FALSE,      seed = sample.int(10^5, 1), probability = TRUE) 
#> 
#> Type:                             Probability estimation 
#> Number of trees:                  500 
#> Sample size:                      649 
#> Number of independent variables:  1000 
#> Mtry:                             182 
#> Target node size:                 10 
#> Variable importance mode:         impurity 
#> Splitrule:                        gini 
#> OOB prediction error (Brier s.):  0.1597182 
#> 
#> 
#> ======================================================
#> ==== Summary of CV Fit for Tuning Hyperparameters ====
#> ======================================================
#> 
#> # Tuning results
#> # 5-fold cross-validation 
#> # A tibble: 5 × 4
#>   splits            id    .metrics         .notes          
#>   <list>            <chr> <list>           <list>          
#> 1 <split [519/130]> Fold1 <tibble [6 × 5]> <tibble [0 × 1]>
#> 2 <split [519/130]> Fold2 <tibble [6 × 5]> <tibble [0 × 1]>
#> 3 <split [519/130]> Fold3 <tibble [6 × 5]> <tibble [0 × 1]>
#> 4 <split [519/130]> Fold4 <tibble [6 × 5]> <tibble [0 × 1]>
#> 5 <split [520/129]> Fold5 <tibble [6 × 5]> <tibble [0 × 1]>
#> 
#> # Metrics Summary
#> # A tibble: 6 × 9
#>    mtry .metric   Mean      SD Fold1 Fold2 Fold3 Fold4 Fold5
#>   <dbl> <chr>    <dbl>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1    32 accuracy 0.815 0.0343  0.823 0.808 0.854 0.762 0.829
#> 2   182 accuracy 0.823 0.0455  0.769 0.823 0.892 0.8   0.829
#> 3   333 accuracy 0.823 0.0380  0.792 0.815 0.885 0.792 0.829
#> 4    32 roc_auc  0.959 0.00477 0.957 0.966 0.959 0.960 0.953
#> 5   182 roc_auc  0.962 0.00688 0.956 0.969 0.964 0.967 0.953
#> 6   333 roc_auc  0.958 0.00851 0.945 0.967 0.961 0.962 0.954

boost_tree

#> Fitting time taken: 0.131439065933228 min
#> 
#> =====================================================
#> =================== Model Summary ===================
#> =====================================================
#> 
#> ══ Workflow [trained] ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
#> Preprocessor: Formula
#> Model: boost_tree()
#> 
#> ── Preprocessor ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
#> .y ~ .
#> 
#> ── Model ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
#> ##### xgb.Booster
#> raw: 137.4 Kb 
#> call:
#>   xgboost::xgb.train(params = list(eta = 0.3, max_depth = 6, gamma = 0, 
#>     colsample_bytree = 1, colsample_bynode = 1, min_child_weight = 1, 
#>     subsample = 1, objective = "multi:softprob"), data = x$data, 
#>     nrounds = 15, watchlist = x$watchlist, verbose = 0, num_class = 5L, 
#>     nthread = 1)
#> params (as set within xgb.train):
#>   eta = "0.3", max_depth = "6", gamma = "0", colsample_bytree = "1", colsample_bynode = "1", min_child_weight = "1", subsample = "1", objective = "multi:softprob", num_class = "5", nthread = "1", validate_parameters = "TRUE"
#> xgb.attributes:
#>   niter
#> callbacks:
#>   cb.evaluation.log()
#> # of features: 1000 
#> niter: 15
#> nfeatures : 1000 
#> evaluation_log:
#>     iter training_mlogloss
#>        1          1.046141
#>        2          0.749682
#> ---                       
#>       14          0.045483
#>       15          0.038782

Prediction Results

Confusion Tables

boost_tree Confusion Matrix on Validation Set
Truth
Prediction Basal Her2 LumA LumB Normal
Basal 37 0 0 0 3
Her2 1 14 2 0 3
LumA 0 1 108 14 0
LumB 0 1 1 28 0
Normal 0 0 1 0 2
rand_forest Confusion Matrix on Validation Set
Truth
Prediction Basal Her2 LumA LumB Normal
Basal 38 0 0 0 3
Her2 0 13 1 0 1
LumA 0 1 109 16 2
LumB 0 2 2 26 0
Normal 0 0 0 0 2

ROC Plot

PR Plot

3.2 Stability check

Taking the prediction methods that pass the prediction check, perform stability analysis.

  1. Specify and justify the appropriate data perturbation(s).
  2. Re-fit the prediction methods on these perturbed data sets.
  3. Evaluate prediction methods on validation data.
  4. Assess stability across the data perturbations as well as across the various methods.
  5. Filter out poor models where necessary and interpret stability results.


n_reps <- 2 # increase for better stability measures when not testing code

# p <- progressr::progressor(steps = n_reps)
# future::plan(multisession, workers = min(n_reps, parallel::detectCores() - 1))
bootstrap_model_results <- future.apply::future_replicate(
  n = n_reps,
  expr = {
    bootstrap <- sample(1:nrow(Xtrain), nrow(Xtrain), replace = TRUE)
    Xtrain_b <- Xtrain[bootstrap, ]
    ytrain_b <- ytrain[bootstrap]
    
    # fit/train models on bootstrap data
    fit_results_b <- fitModels(Xtrain = Xtrain_b, ytrain = ytrain_b,
                               model_list = model_list, cv_options = cv_options,
                               use = params$modeling_pkg)

    # make prediction on validation set
    pred_results_b <- predictModels(fit_list = fit_results_b, Xtest = Xvalid)

    # evaluate predictions on validation set
    eval_results_b <- evaluateModels(pred_df = pred_results_b, ytest = yvalid)
    
    # collect feature importance metrics from model fits
    imp_results_b <- interpretModels(fit_list = fit_results_b)
    
    return(list(# fit = fit_results_b,  # uncomment if need bootstrap fits; can be memory intensive
                predictions = pred_results_b,
                eval_metrics = eval_results_b,
                importances = imp_results_b))
  },
  simplify = FALSE
)
#> [10:33:15] WARNING: amalgamation/../src/learner.cc:1115: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'multi:softprob' was changed from 'merror' to 'mlogloss'. Explicitly set eval_metric if you'd like to restore the old behavior.
#> [10:35:12] WARNING: amalgamation/../src/learner.cc:1115: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'multi:softprob' was changed from 'merror' to 'mlogloss'. Explicitly set eval_metric if you'd like to restore the old behavior.

bootstrap_model_errs <- purrr::map_dfr(bootstrap_model_results,
                                       ~.x$eval_metrics$metrics,
                                       .id = "bootstrap_id")
bootstrap_model_preds <- purrr::map(bootstrap_model_results, "predictions")
bootstrap_model_imps <- purrr::map_dfr(bootstrap_model_results, "importances",
                                       .id = "bootstrap_id")

# summarize bootstrap model error metrics
bootstrap_model_errs_summary <- bootstrap_model_errs %>%
  tidyr::pivot_longer(cols = c(-bootstrap_id, -Metric), 
                      names_to = "Method", values_to = "Value") %>%
  dplyr::group_by(Method, Metric) %>%
  dplyr::summarise(Mean = mean(Value), SD = sd(Value), .groups = "drop") %>%
  tidyr::pivot_longer(cols = c(Mean, SD), 
                      values_to = "Value", names_to = "Statistic") %>%
  tidyr::pivot_wider(names_from = "Method", values_from = "Value") %>%
  dplyr::arrange(Metric, Statistic)

Table

# table of accuracy metrics
prettyTable(
  bootstrap_model_errs_summary, 
  digits = 2, sigfig = FALSE, rownames = FALSE,
  caption = "Validation Prediction Accuracies Over Bootstrapped Training Fits", 
  html_options = list(
    extensions = "RowGroup",
    options = list(
      dom = "t",
      pageLength = nrow(bootstrap_model_errs_summary),
      scrollY = "500px",
      rowGroup = list(dataSrc = 0),
      columnDefs = list(list(className = "dt-center", targets = "_all"),
                        list(visible = FALSE, targets = 0),
                        list(title = "Metric", targets = 1))
    )
  )
)

Plot

# boxplots
bootstrap_model_errs %>%
  tidyr::pivot_longer(cols = c(-bootstrap_id, -Metric), 
                      names_to = "Method", values_to = "Value") %>%
  plotBoxplot(x_str = "Method", y_str = "Value") +
  ggplot2::facet_wrap(~ Metric) +
  ggplot2::labs(title = "Validation Prediction Accuracies Over Bootstrapped Training Fits")

3.3 Interpretability

For the models that pass the prediction and stability checks, extract the important features in the predictive models that are stable across both data and model perturbations. Determining the importance of a feature can be method dependent.


Full Model (without stability)

Table

prettyTable(imp_results, digits = 2, sigfig = FALSE,
            caption = "Variable Importances")

Plots

plotFeatureImportance(imp_results,
                      use_rankings = FALSE,
                      use_facets = TRUE,
                      interactive = FALSE)

plotFeatureImportancePair(imp_results,
                          use_rankings = TRUE,
                          interactive = FALSE)

Bootstrapped Model (with stability)

Table

bootstrap_model_imps_summary <- bootstrap_model_imps %>%
  dplyr::group_by(Method, Variable) %>%
  dplyr::summarise(`Mean Importance` = mean(Importance),
                   `Median Importance` = median(Importance),
                   `SD Importance` = sd(Importance),
                   `Min Importance` = min(Importance),
                   `Max Importance` = max(Importance), 
                   .groups = "keep")
prettyTable(
  bootstrap_model_imps_summary, 
  digits = 2, sigfig = F, 
  caption = "Summary of variable importances across bootstrapped models"
)

Plots

plotFeatureImportanceStability(bootstrap_model_imps,
                               use_rankings = FALSE,
                               use_facets = TRUE,
                               interactive = FALSE)

4 Main Results

Interpret and summarize the prediction and stability results.


Evaluate pipeline on test data.

Xtrain_final <- dplyr::bind_rows(Xtrain, Xvalid)
ytrain_final <- c(ytrain, yvalid)

# fit/train models
fit_results_final <- fitModels(Xtrain = Xtrain_final, ytrain = ytrain_final,
                               model_list = model_list, cv_options = cv_options,
                               use = params$modeling_pkg)
#> [10:39:57] WARNING: amalgamation/../src/learner.cc:1115: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'multi:softprob' was changed from 'merror' to 'mlogloss'. Explicitly set eval_metric if you'd like to restore the old behavior.

# make prediction on test set
pred_results_final <- predictModels(fit_list = fit_results_final, Xtest = Xtest)

# evaluate predictions on test set
eval_results_final <- evaluateModels(pred_df = pred_results_final, ytest = ytest)

# collect feature importance metrics from model fits
imp_results_final <- interpretModels(fit_list = fit_results_final)

Summarize test set prediction and/or interpretability results.


Fit Summary

rand_forest

#> Fitting time taken: 4.52916546662648 min
#> 
#> =====================================================
#> ================ Tuned Model Summary ================
#> =====================================================
#> 
#> ══ Workflow [trained] ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
#> Preprocessor: Formula
#> Model: rand_forest()
#> 
#> ── Preprocessor ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
#> .y ~ .
#> 
#> ── Model ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
#> Ranger result
#> 
#> Call:
#>  ranger::ranger(x = maybe_data_frame(x), y = y, mtry = min_cols(~333,      x), importance = ~"impurity", num.threads = 1, verbose = FALSE,      seed = sample.int(10^5, 1), probability = TRUE) 
#> 
#> Type:                             Probability estimation 
#> Number of trees:                  500 
#> Sample size:                      865 
#> Number of independent variables:  1000 
#> Mtry:                             333 
#> Target node size:                 10 
#> Variable importance mode:         impurity 
#> Splitrule:                        gini 
#> OOB prediction error (Brier s.):  0.1390541 
#> 
#> 
#> ======================================================
#> ==== Summary of CV Fit for Tuning Hyperparameters ====
#> ======================================================
#> 
#> # Tuning results
#> # 5-fold cross-validation 
#> # A tibble: 5 × 4
#>   splits            id    .metrics         .notes          
#>   <list>            <chr> <list>           <list>          
#> 1 <split [692/173]> Fold1 <tibble [6 × 5]> <tibble [0 × 1]>
#> 2 <split [692/173]> Fold2 <tibble [6 × 5]> <tibble [0 × 1]>
#> 3 <split [692/173]> Fold3 <tibble [6 × 5]> <tibble [0 × 1]>
#> 4 <split [692/173]> Fold4 <tibble [6 × 5]> <tibble [0 × 1]>
#> 5 <split [692/173]> Fold5 <tibble [6 × 5]> <tibble [0 × 1]>
#> 
#> # Metrics Summary
#> # A tibble: 6 × 9
#>    mtry .metric   Mean     SD Fold1 Fold2 Fold3 Fold4 Fold5
#>   <dbl> <chr>    <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1    32 accuracy 0.827 0.0142 0.832 0.815 0.809 0.844 0.832
#> 2   182 accuracy 0.846 0.0113 0.850 0.838 0.850 0.861 0.832
#> 3   333 accuracy 0.847 0.0176 0.850 0.832 0.867 0.861 0.827
#> 4    32 roc_auc  0.967 0.0126 0.969 0.978 0.979 0.953 0.954
#> 5   182 roc_auc  0.969 0.0151 0.975 0.982 0.981 0.951 0.953
#> 6   333 roc_auc  0.967 0.0169 0.973 0.981 0.982 0.946 0.951

boost_tree

#> Fitting time taken: 0.149719297885895 min
#> 
#> =====================================================
#> =================== Model Summary ===================
#> =====================================================
#> 
#> ══ Workflow [trained] ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
#> Preprocessor: Formula
#> Model: boost_tree()
#> 
#> ── Preprocessor ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
#> .y ~ .
#> 
#> ── Model ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
#> ##### xgb.Booster
#> raw: 155.1 Kb 
#> call:
#>   xgboost::xgb.train(params = list(eta = 0.3, max_depth = 6, gamma = 0, 
#>     colsample_bytree = 1, colsample_bynode = 1, min_child_weight = 1, 
#>     subsample = 1, objective = "multi:softprob"), data = x$data, 
#>     nrounds = 15, watchlist = x$watchlist, verbose = 0, num_class = 5L, 
#>     nthread = 1)
#> params (as set within xgb.train):
#>   eta = "0.3", max_depth = "6", gamma = "0", colsample_bytree = "1", colsample_bynode = "1", min_child_weight = "1", subsample = "1", objective = "multi:softprob", num_class = "5", nthread = "1", validate_parameters = "TRUE"
#> xgb.attributes:
#>   niter
#> callbacks:
#>   cb.evaluation.log()
#> # of features: 1000 
#> niter: 15
#> nfeatures : 1000 
#> evaluation_log:
#>     iter training_mlogloss
#>        1          1.050810
#>        2          0.747666
#> ---                       
#>       14          0.045500
#>       15          0.038370

Prediction Results

Confusion Tables

boost_tree Confusion Matrix on Test Set
Truth
Prediction Basal Her2 LumA LumB Normal
Basal 37 1 0 1 2
Her2 1 13 0 1 1
LumA 0 1 110 17 4
LumB 0 2 3 23 0
Normal 0 0 0 0 1
rand_forest Confusion Matrix on Test Set
Truth
Prediction Basal Her2 LumA LumB Normal
Basal 37 1 0 0 2
Her2 1 13 0 0 1
LumA 0 1 110 15 4
LumB 0 2 3 27 0
Normal 0 0 0 0 1

ROC Plot

PR Plot

5 Post hoc analysis

Move beyond the global prediction accuracy metrics and dive deeper into individual-level predictions for the validation and/or test set, i.e., provide a more “local” analysis.

  • Examine any points that had poor predictions.
  • Examine differences between prediction methods.


pred_results_final %>%
  dplyr::mutate(.id = rep(1:nrow(Xtest), length.out = dplyr::n())) %>%
  tidyr::pivot_wider(id_cols = .id, 
                     names_from = "Method", values_from = "predictions") %>%
  dplyr::mutate(`True Responses` = ytest) %>%
  plotPairs(columns = 2:(length(unique(pred_results_final$Method)) + 2),
            title = "Comparison of model test predictions")

6 Conclusions

Reiterate main findings, note any caveats, and clearly translate findings/analysis back to the domain problem context.


LS0tCnRpdGxlOiAiUENTIERvY3VtZW50YXRpb24iCmF1dGhvcjogIiIKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUIgJWQsICVZJylgIgpoZWFkZXItaW5jbHVkZXM6CiAgICAtIFx1c2VwYWNrYWdle2Zsb2F0fQogICAgLSBcdXNlcGFja2FnZXthbXNtYXRofQogICAgLSBcdXNlcGFja2FnZXtnZW5zeW1ifQogICAgLSBcdXNlcGFja2FnZXt0Y29sb3Jib3h9Cm91dHB1dDoKICBybWRmb3JtYXRzOjptYXRlcmlhbDoKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgdXNlX2Jvb2tkb3duOiB0cnVlCiAgICBmaWdfd2lkdGg6IDEwCiAgICBmaWdfaGVpZ2h0OiA4CiAgICBsaWdodGJveDogdHJ1ZQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgaW5jbHVkZXM6CiAgICAgIGJlZm9yZV9ib2R5OiBodG1sL3NldHVwLmh0bWwKICBwZGZfZG9jdW1lbnQ6CiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKcGFyYW1zOgogICMjIElOUFVUIFBBUkFNRVRFUlMgSEVSRSBPUiBVU0lORyAiS25pdCB3aXRoIFBhcmFtZXRlcnMuLi4iIElOIEFCT1ZFIEtOSVQgTUVOVQogIFhfZmlsZXBhdGg6CiAgICBsYWJlbDogIlggRGF0YSIKICAgIHZhbHVlOiBkYXRhL3RjZ2FfYnJjYV9hcnJheV9kYXRhLnJkcwogICAgaW5wdXQ6IGZpbGUgCiAgeV9maWxlcGF0aDoKICAgIGxhYmVsOiAieSBkYXRhIgogICAgdmFsdWU6IGRhdGEvdGNnYV9icmNhX3N1YnR5cGVzLnJkcwogICAgaW5wdXQ6IGZpbGUKICB0cmFpbl9wcm9wOgogICAgbGFiZWw6ICJUcmFpbmluZyBkYXRhIHByb3BvcnRpb24iCiAgICB2YWx1ZTogMC42CiAgICBpbnB1dDogbnVtZXJpYwogIHZhbGlkX3Byb3A6CiAgICBsYWJlbDogIlZhbGlkYXRpb24gZGF0YSBwcm9wb3J0aW9uIgogICAgdmFsdWU6IDAuMgogICAgaW5wdXQ6IG51bWVyaWMKICB0ZXN0X3Byb3A6CiAgICBsYWJlbDogIlRlc3QgZGF0YSBwcm9wb3J0aW9uIgogICAgdmFsdWU6IDAuMgogICAgaW5wdXQ6IG51bWVyaWMKICBtb2RlbGluZ19wa2c6CiAgICBsYWJlbDogIk1vZGVsaW5nIFBhY2thZ2UiCiAgICB2YWx1ZTogInRpZHltb2RlbHMiCiAgICBpbnB1dDogc2VsZWN0CiAgICBjaG9pY2VzOiBbImNhcmV0IiwgImgybyIsICJ0aWR5bW9kZWxzIl0KICBzZWVkOgogICAgbGFiZWw6ICJSYW5kb20gU2VlZCIKICAgIHZhbHVlOiAxMjM0NQogICAgaW5wdXQ6IG51bWVyaWMKY3NzOiBbY3NzL2N1c3RvbV9tYXRlcmlhbF9ybWRfdGhlbWUuY3NzLCBjc3MvY3VzdG9tX2NoZWNrYm94LmNzc10KIyBydW50aW1lOiBzaGlueQotLS0KCmBgYHtyIHNldHVwLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCByZXN1bHRzID0gImhpZGUifQpzb3VyY2UoInNjcmlwdHMvcm1kLXNldHVwLlIiLCBsb2NhbCA9IGtuaXRyOjprbml0X2dsb2JhbCgpKQoKIyBsb2FkIGluIHBhY2thZ2VzCmxpYnJhcnkobWFncml0dHIpICAjIGNhbiByZW1vdmUgb25jZSBwYWNrYWdlIGlzIGNyZWF0ZWQgYW5kIGAlPiVgIGlzIGltcG9ydGVkCmZvciAoZiBpbiBsaXN0LmZpbGVzKCJSIiwgcGF0dGVybiA9ICIuUiIsIGZ1bGwubmFtZXMgPSBUUlVFKSkgewogIHNvdXJjZShmLCBjaGRpciA9IFQpCn0KCiMgc2V0IHNlZWQKc2V0LnNlZWQocGFyYW1zJHNlZWQpCgojIHZhbGlkYXRlIGlucHV0cwp2YWxpZGF0ZURhdGFTcGxpdChwYXJhbXMkdHJhaW5fcHJvcCwgcGFyYW1zJHZhbGlkX3Byb3AsIHBhcmFtcyR0ZXN0X3Byb3ApCgojIGxvYWQgZGF0YSBpbgpYIDwtIGxvYWRGaWxlKHBhcmFtcyRYX2ZpbGVwYXRoKQp5IDwtIGxvYWRGaWxlKHBhcmFtcyR5X2ZpbGVwYXRoKQp2YWxpZGF0ZURhdGEoWCwgeSkKCiMgaW5pdGlhbGl6ZSBjb3VudGVyIGZvciBzdWJjaHVua2lmeQpjaHVua19pZHggPC0gMQpgYGAKCiMgRG9tYWluIHByb2JsZW0gZm9ybXVsYXRpb24KCldoYXQgaXMgdGhlIHJlYWwtd29ybGQgcXVlc3Rpb24/IFRoaXMgY291bGQgYmUgaHlwb3RoZXNpcy1kcml2ZW4gb3IgZGlzY292ZXJ5LWJhc2VkLgoKYGBge2FzaXMsIGhlbHAgPSBUUlVFfQpTb21lIGFkdmljZQpgYGAKCmBgYHthc2lzLCBpbnRlcmFjdGl2ZV90ZXh0ID0gVFJVRX0KCmBgYAoKV2h5IGlzIHRoaXMgcXVlc3Rpb24gaW50ZXJlc3RpbmcgYW5kIGltcG9ydGFudD8gV2hhdCBhcmUgdGhlIGltcGxpY2F0aW9ucyBvZiBiZXR0ZXIgdW5kZXJzdGFuZGluZyB0aGlzIGRhdGE/CgpgYGB7YXNpcywgaW50ZXJhY3RpdmVfdGV4dCA9IFRSVUV9CgpgYGAKCkJyaWVmbHkgZGVzY3JpYmUgYW55IGJhY2tncm91bmQgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIHVuZGVyc3RhbmQgdGhpcyBwcm9ibGVtLgoKYGBge2FzaXMsIGhlbHAgPSBUUlVFfQpTb21lIGFkdmljZQpgYGAKCmBgYHthc2lzLCBpbnRlcmFjdGl2ZV90ZXh0ID0gVFJVRX0KCmBgYAoKQnJpZWZseSBkZXNjcmliZSBob3cgdGhpcyBxdWVzdGlvbiBjYW4gYmUgYW5zd2VyZWQgaW4gdGhlIGNvbnRleHQgb2YgYSBtb2RlbCBvciBhbmFseXNpcy4KCmBgYHthc2lzLCBpbnRlcmFjdGl2ZV90ZXh0ID0gVFJVRX0KCmBgYAoKT3V0bGluZSB0aGUgcmVzdCBvZiB0aGUgcmVwb3J0L2FuYWx5c2lzLgoKYGBge2FzaXMsIGludGVyYWN0aXZlX3RleHQgPSBUUlVFfQoKYGBgCgojIERhdGEKCldoYXQgaXMgdGhlIGRhdGEgdW5kZXIgaW52ZXN0aWdhdGlvbj8gUHJvdmlkZSBhIGJyaWVmIG92ZXJ2aWV3L2Rlc2NyaXB0aW9uIG9mIHRoZSBkYXRhLgoKYGBge2FzaXMsIGludGVyYWN0aXZlX3RleHQgPSBUUlVFfQoKYGBgCgpEZXNjcmliZSBob3cgeW91ciBkYXRhIGNvbm5lY3RzIHRvIHRoZSBkb21haW4gcHJvYmxlbS4KCmBgYHthc2lzLCBpbnRlcmFjdGl2ZV90ZXh0ID0gVFJVRX0KCmBgYAoKIyMgRGF0YSBDb2xsZWN0aW9uCgpIb3cgd2FzIHRoZSBkYXRhIGNvbGxlY3RlZCBvciBnZW5lcmF0ZWQgKGluY2x1ZGluZyBkZXRhaWxzIG9uIHRoZSBleHBlcmltZW50YWwgZGVzaWduKT8gQmUgYXMgdHJhbnNwYXJlbnQgYXMgcG9zc2libGUgc28gdGhhdCBjb25jbHVzaW9ucyBtYWRlIGZyb20gdGhpcyBkYXRhIGFyZSBub3QgbWlzaW50ZXJwcmV0ZWQgZG93biB0aGUgcm9hZC4KCmBgYHthc2lzLCBpbnRlcmFjdGl2ZV90ZXh0ID0gVFJVRX0KCmBgYAoKRGVzY3JpYmUgYW55IGxpbWl0YXRpb25zIHdoZW4gdXNpbmcgdGhlIGRhdGEgdG8gYW5zd2VyIHRoZSBkb21haW4gcHJvYmxlbSBvZiBpbnRlcmVzdC4KCmBgYHthc2lzLCBpbnRlcmFjdGl2ZV90ZXh0ID0gVFJVRX0KCmBgYAoKV2hlcmUgaXMgdGhlIGRhdGEgc3RvcmVkLCBhbmQgaG93IGNhbiBpdCBiZSBhY2Nlc3NlZCBieSBvdGhlcnMgKGlmIGFwcGxpY2FibGUpPwoKYGBge2FzaXMsIGludGVyYWN0aXZlX3RleHQgPSBUUlVFfQoKYGBgCgojIyBEYXRhIFNwbGl0dGluZwoKVE9ETzogYWRkIGFkdmljZSBmb3IgcG9zc2libGUgZGF0YSBzcGxpdHMsIEFLIGdldHRpbmcgbmljZSBmaWd1cmUgdG9nZXRoZXIKCkRlY2lkZSBvbiB0aGUgcHJvcG9ydGlvbiBvZiBkYXRhIGluIGVhY2ggc3BsaXQuCgpEZWNpZGUgb24gdGhlICJob3ciIHRvIHNwbGl0IHRoZSBkYXRhIChlLmcuLCByYW5kb20gc2FtcGxpbmcsIHN0cmF0aWZpZWQgc2FtcGxpbmcsIGV0Yy4pLCBhbmQgZXhwbGFpbiB3aHkgdGhpcyBpcyBhIHJlYXNvbmFibGUgd2F5IHRvIHNwbGl0IHRoZSBkYXRhLgoKYGBge2FzaXMsIGludGVyYWN0aXZlX3RleHQgPSBUUlVFfQoKYGBgCgpTcGxpdCB0aGUgZGF0YSBpbnRvIGEgdHJhaW5pbmcsIHZhbGlkYXRpb24sIGFuZCB0ZXN0IHNldC4KCmBgYHtyIHNwbGl0LWRhdGF9CmRhdGFfc3BsaXQgPC0gZGF0YVNwbGl0KFggPSBYLCB5ID0geSwgc3RyYXRpZmllZF9ieSA9IHksCiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWluX3Byb3AgPSBwYXJhbXMkdHJhaW5fcHJvcCwgCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkX3Byb3AgPSBwYXJhbXMkdmFsaWRfcHJvcCwgCiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfcHJvcCA9IHBhcmFtcyR0ZXN0X3Byb3ApClh0cmFpbiA8LSBkYXRhX3NwbGl0JFgkdHJhaW4KWHZhbGlkIDwtIGRhdGFfc3BsaXQkWCR2YWxpZGF0ZQpYdGVzdCA8LSBkYXRhX3NwbGl0JFgkdGVzdAp5dHJhaW4gPC0gZGF0YV9zcGxpdCR5JHRyYWluCnl2YWxpZCA8LSBkYXRhX3NwbGl0JHkkdmFsaWRhdGUKeXRlc3QgPC0gZGF0YV9zcGxpdCR5JHRlc3QKYGBgCgpQcm92aWRlIHN1bW1hcnkgc3RhdGlzdGljcyBhbmQvb3IgZmlndXJlcyBvZiB0aGUgdGhyZWUgZGF0YSBzZXRzIHRvIGlsbHVzdHJhdGUgaG93IHNpbWlsYXIgKG9yIGRpZmZlcmVudCkgdGhleSBhcmUuCgpgYGB7YXNpcywgaW50ZXJhY3RpdmVfdGV4dCA9IFRSVUV9CgpgYGAKCiMjIyBEYXRhIFNwbGl0dGluZyBPdmVydmlldyB7LnRhYnNldCAuY3VzdG9tLXRhYnN9CgojIyMjIFggRGF0YSBTcGxpdCB7LnVubnVtYmVyZWR9CgpgYGB7ciBYLWRhdGEtc3BsaXQsIGFkZF9uZXdfbGluZSA9IFRSVUV9CnBsb3REYXRhU3BsaXQoWHRyYWluLCBYdmFsaWQsIFh0ZXN0LCAKICAgICAgICAgICAgICB4bGFiID0gIlgiLCB0aXRsZSA9ICJPdmVyYWxsIFggRGlzdHJpYnV0aW9uIikKYGBgCgojIyMjIFkgRGF0YSBTcGxpdCB7LnVubnVtYmVyZWR9CgpgYGB7ciB5LWRhdGEtc3BsaXQsIGFkZF9uZXdfbGluZSA9IFRSVUV9CnBsb3REYXRhU3BsaXQoeXRyYWluLCB5dmFsaWQsIHl0ZXN0LCAKICAgICAgICAgICAgICB4bGFiID0gInkiLCB0aXRsZSA9ICJPdmVyYWxsIHkgRGlzdHJpYnV0aW9uIikKYGBgCgojIyBEYXRhIENsZWFuaW5nIGFuZCBQcmVwcm9jZXNzaW5nCgpXaGF0IHN0ZXBzIHdlcmUgdGFrZW4gdG8gY2xlYW4gdGhlIGRhdGE/IE1vcmUgaW1wb3J0YW50bHksIHdoeSB3YXMgdGhlIGRhdGEgY2xlYW5lZCBpbiB0aGlzIHdheT8KCkRpc2N1c3MgYWxsIGluY29uc2lzdGVuY2llcywgcHJvYmxlbXMsIG9kZGl0aWVzIGluIHRoZSBkYXRhIChlLmcuLCBtaXNzaW5nIGRhdGEsIGVycm9ycyBpbiBkYXRhLCBvdXRsaWVycywgZXRjLikuCgpSZWNvcmQgeW91ciBwcmVwcm9jZXNzaW5nIHN0ZXBzIGluIGEgd2F5IHN1Y2ggdGhhdCBpZiBzb21lb25lIGVsc2Ugd2VyZSB0byByZXByb2R1Y2UgeW91ciBhbmFseXNpcywgdGhleSBjb3VsZCBlYXNpbHkgcmVwbGljYXRlIGFuZCB1bmRlcnN0YW5kIHlvdXIgc3RlcHMuCgpJdCBjYW4gYmUgaGVscGZ1bCB0byBpbmNsdWRlIHJlbGV2YW50IHBsb3RzIHRoYXQgZXhwbGFpbi9qdXN0aWZ5IHRoZSBjaG9pY2VzIHRoYXQgd2VyZSBtYWRlIHdoZW4gY2xlYW5pbmcgdGhlIGRhdGEuCgpJZiBtb3JlIHRoYW4gb25lIHByZXByb2Nlc3NpbmcgcGlwZWxpbmUgaXMgcmVhc29uYWJsZSwgZXhhbWluZSB0aGUgaW1wYWN0cyBvZiB0aGVzZSBhbHRlcm5hdGl2ZSBwcmVwcm9jZXNzaW5nIHBpcGVsaW5lcyBvbiB0aGUgZmluYWwgZGF0YSByZXN1bHRzLgoKQWdhaW4sIGJlIGFzIHRyYW5zcGFyZW50IGFzIHBvc3NpYmxlLiBUaGlzIGFsbG93cyBvdGhlcnMgdG8gbWFrZSB0aGVpciBvd24gZWR1Y2F0ZWQgZGVjaXNpb25zIG9uIGhvdyBiZXN0IHRvIHByZXByb2Nlc3MgdGhlIGRhdGEuCgpgYGB7YXNpcywgaW50ZXJhY3RpdmVfdGV4dCA9IFRSVUV9CkdpdmVuIHRoaXMgZXhhbXBsZSBUQ0dBIEJSQ0EgZGF0YSBzZXQsIHdlIGZpcnN0IHByZXByb2Nlc3MgdGhlIGRhdGEgYnkgcmVtb3ZpbmcgY29uc3RhbnQgb3IgZHVwbGljYXRlZCBjb2x1bW5zLiBUaGVuIHNpbmNlIHRoZSBhcnJheSBkYXRhIGlzIGhpZ2hseSByaWdodCBza2V3ZWQsIHdlIHdpbGwgbG9nLXRyYW5zZm9ybSAoaS5lLiwgbG9nKHggKyAxKSkgdGhlIGRhdGEuIEZpbmFsbHksIHRvIGtlZXAgdGhpcyBleGFtcGxlIHRlbXBsYXRlIHJlbGF0aXZlbHkgcXVpY2sgdG8gcnVuLCB3ZSB3aWxsIG9ubHkga2VlcCB0aGUgMTAwMCBmZWF0dXJlcyB3aXRoIHRoZSBoaWdoZXN0IHZhcmlhbmNlLgpgYGAKCmBgYHtyIHByZXByb2Nlc3MtZGF0YX0KIyMgRE8gREFUQSBDTEVBTklORyAvIFBSRS1QUk9DRVNTSU5HIEhFUkUgClh0cmFpbiA8LSBsb2coWHRyYWluICsgMSkgJT4lCiAgcmVtb3ZlQ29uc3RhbnRDb2xzKHZlcmJvc2UgPSAxKSAlPiUKICByZW1vdmVEdXBsaWNhdGVDb2xzKHZlcmJvc2UgPSAxKSAlPiUKICBmaWx0ZXJDb2xzQnlWYXIobWF4X3AgPSAxMDAwKQpYdmFsaWQgPC0gbG9nKFh2YWxpZCArIDEpWywgY29sbmFtZXMoWHRyYWluKV0KWHRlc3QgPC0gbG9nKFh0ZXN0ICsgMSlbLCBjb2xuYW1lcyhYdHJhaW4pXQpgYGAKCgojIyBEYXRhIEV4cGxvcmF0aW9uCgpUT0RPOiBBZGQgZHJhZyBhbmQgZHJvcCBmZWF0dXJlIGluIHNoaW55IHZlcnNpb24gZm9yIG90aGVyIGltYWdlcwoKVGhlIG1haW4gZ29hbCBvZiB0aGlzIHNlY3Rpb24gaXMgdG8gZ2l2ZSB0aGUgcmVhZGVyIGEgZmVlbCBmb3Igd2hhdCB0aGUgZGF0YSAibG9va3MgbGlrZSIgYXQgYSBiYXNpYyBsZXZlbC4KClByb3ZpZGUgcGxvdHMgdGhhdCBzdW1tYXJpemUgdGhlIGRhdGEgYW5kIHBlcmhhcHMgZXZlbiBwbG90cyB0aGF0IGNvbnZleSBzb21lIHNtYWxsZXIgZmluZGluZ3Mgd2hpY2ggdWx0aW1hdGVseSBtb3RpdmF0ZSB0aGUgbWFpbiBmaW5kaW5ncy4KClByb3ZpZGUgYWRkaXRpb25hbCBwbG90cyByZXByZXNlbnRpbmcgcmVtYWluaW5nIG9kZGl0aWVzIGFmdGVyIHByZS1wcm9jZXNzaW5nIGlmIGFwcGxpY2FibGUuCgpBZGQgc3VtbWFyeSBzdGF0aXN0aWNzIGluIGFjY29tcGFueWluZyB0YWJsZXMgKG9yIGluIGZpZ3VyZXMpIGZvciBxdWljayBjb21wYXJpc29ucy4KCmBgYHthc2lzLCBpbnRlcmFjdGl2ZV90ZXh0ID0gVFJVRX0KCmBgYAoKIyMjIERhdGEgT3ZlcnZpZXcgey50YWJzZXQgLmN1c3RvbS10YWJzfQoKYGBge3IgZGF0YS1kaW1zLCBlY2hvID0gRkFMU0V9CiMgc3VtbWFyeSBvZiBkYXRhIGRpbWVuc2lvbnMKZGF0YURpbWVuc2lvbnMoWHRyYWluID0gWHRyYWluLCBYdmFsaWQgPSBYdmFsaWQsIFh0ZXN0ID0gWHRlc3QpCmBgYAoKYGBge3IgZGF0YS10eXBlcywgcmVzdWx0cz0iYXNpcyIsIGFkZF9uZXdfbGluZSA9IFRSVUV9CiMgc3VtbWFyeSBvZiB0eXBlcyBvZiBmZWF0dXJlcyBpbiAoWCwgeSkgZGF0YQpkYXRhVHlwZXMoWCA9IFh0cmFpbiwgeSA9IHl0cmFpbikKYGBgCgojIyMjIFN1bW1hcnkgVGFibGVzIHsudW5udW1iZXJlZH0KCmBgYHtyIGRhdGEtc3VtbWFyeS10YWJsZSwgcmVzdWx0cz0iYXNpcyIsIGFkZF9uZXdfbGluZSA9IFRSVUV9CiMgYnJvYWQgYXJyYXkgb2Ygc3VtbWFyeSBzdGF0aXN0aWNzIGZvciBmZWF0dXJlcyBpbiB0cmFpbmluZyAoWCwgeSkKdGFiX2xzIDwtIGRhdGFTdW1tYXJ5KFggPSBYdHJhaW4sIHkgPSB5dHJhaW4pCmZvciAoZHR5cGUgaW4gbmFtZXModGFiX2xzKSkgeyAgIyBncm91cGVkIGJ5IGRhdGEgdHlwZQogIHNpbUNoZWY6OjpzdWJjaHVua2lmeSh0YWJfbHNbW2R0eXBlXV0sIGkgPSBjaHVua19pZHgsIAogICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9hcmdzID0gInJlc3VsdHM9J2FzaXMnIikKICBjaHVua19pZHggPC0gY2h1bmtfaWR4ICsgMQp9CmBgYAoKIyMjIyBYIERpc3RyaWJ1dGlvbiB7LnVubnVtYmVyZWR9CgpgYGB7ciB4LWRpc3QtcGxvdCwgYWRkX25ld19saW5lID0gVFJVRX0KIyBwbG90IFggZGlzdHJpYnV0aW9uCnBsb3REYXRhRGlzdHJpYnV0aW9uKGRhdGEgPSBYdHJhaW4sIAogICAgICAgICAgICAgICAgICAgICB4bGFiID0gIlgiLCB0aXRsZSA9ICJUcmFpbmluZyBYIERpc3RyaWJ1dGlvbiIpCmBgYAoKIyMjIyBZIERpc3RyaWJ1dGlvbiB7LnVubnVtYmVyZWR9CgpgYGB7ciB5LWRpc3QtcGxvdCwgYWRkX25ld19saW5lID0gVFJVRX0KIyBwbG90IHkgZGlzdHJpYnV0aW9uCnBsb3REYXRhRGlzdHJpYnV0aW9uKGRhdGEgPSB5dHJhaW4sIAogICAgICAgICAgICAgICAgICAgICB4bGFiID0gInkiLCB0aXRsZSA9ICJUcmFpbmluZyB5IERpc3RyaWJ1dGlvbiIpCmBgYAoKIyMjIyBEYXRhIEhlYXRtYXAgey51bm51bWJlcmVkfQoKYGBge3IgZGF0YS1oZWF0bWFwLCBhZGRfbmV3X2xpbmUgPSBUUlVFfQojIChjbHVzdGVyZWQpIGhlYXRtYXAgb2YgKFgsIHkpIGRhdGEKcGxvdERhdGFIZWF0bWFwKFggPSBYdHJhaW4sIHkgPSB5dHJhaW4sIGNsdXN0X3Jvd3MgPSBUUlVFLCBjbHVzdF9jb2xzID0gVFJVRSwKICAgICAgICAgICAgICAgIHNob3dfeXRleHQgPSBGQUxTRSwgeF90ZXh0X2FuZ2xlID0gVFJVRSkKYGBgCgojIyMjIEZlYXR1cmUgQ29ycmVsYXRpb24gey51bm51bWJlcmVkfQoKYGBge3IgZmVhdHVyZS1jb3ItaGVhdG1hcCwgYWRkX25ld19saW5lID0gVFJVRX0KIyAoY2x1c3RlcmVkKSBjb3JyZWxhdGlvbiBoZWF0bWFwCnBsb3RDb3JIZWF0bWFwKFggPSBYdHJhaW4sIGNvcl90eXBlID0gInBlYXJzb24iLCBjbHVzdCA9IFRSVUUsCiAgICAgICAgICAgICAgIHhfdGV4dF9hbmdsZSA9IFRSVUUpICsKICBnZ3Bsb3QyOjpsYWJzKHggPSAiRmVhdHVyZXMiLCB5ID0gIkZlYXR1cmVzIiwgZmlsbCA9ICJDb3IuIikKYGBgCgojIyMjIEZlYXR1cmUgUGFpciBQbG90cyB7LnVubnVtYmVyZWR9CgpgYGB7ciBmZWF0dXJlLXBhaXItcGxvdCwgYWRkX25ld19saW5lID0gVFJVRX0KIyBmZWF0dXJlIHBhaXIgcGxvdCAoZm9yIGEgc3Vic2V0IG9mIGZlYXR1cmVzKQprZWVwX2ZlYXR1cmVzIDwtIHNvcnQoCiAgc2FtcGxlKDE6bmNvbChYdHJhaW4pLCBtaW4obmNvbChYdHJhaW4pLCA2KSwgcmVwbGFjZSA9IEZBTFNFKQopCnBsb3RQYWlycyhkYXRhID0gWHRyYWluLCBjb2x1bW5zID0ga2VlcF9mZWF0dXJlcywgCiAgICAgICAgICBjb2xvciA9IHl0cmFpbiwgY29sb3JfbGFiZWwgPSAieSIpCmBgYAoKIyMjIyBNYXJnaW5hbCBBc3NvY2lhdGlvbnMgey51bm51bWJlcmVkfQoKYGBge3IgbWFyZ2luYWwtYXNzb2MtcGxvdCwgYWRkX25ld19saW5lID0gVFJVRX0KIyBtYXJnaW5hbCBhc3NvY2lhdGlvbiBwbG90cyAoZm9yIGEgc3Vic2V0IG9mIGZlYXR1cmVzKQpjYXJldDo6ZmVhdHVyZVBsb3QoeCA9IFh0cmFpblssIGtlZXBfZmVhdHVyZXNdLAogICAgICAgICAgICAgICAgICAgeSA9IHl0cmFpbiwKICAgICAgICAgICAgICAgICAgIHBsb3QgPSBpZiAoaXMuZmFjdG9yKHl0cmFpbikpICJib3giIGVsc2UgInNjYXR0ZXIiLAogICAgICAgICAgICAgICAgICAgc2NhbGVzID0gbGlzdCh4ID0gbGlzdChyZWxhdGlvbiA9ICJmcmVlIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gbGlzdChyZWxhdGlvbiA9ICJmcmVlIikpKQpgYGAKCiMjIyMgUENBIHsudW5udW1iZXJlZH0KCmBgYHtyIHBjYS1wbG90LCBhZGRfbmV3X2xpbmUgPSBUUlVFfQojIHBjYSBwbG90CnBsb3RQQ0EoWCA9IFh0cmFpbiwgbnBjcyA9IDMsIGNvbG9yID0geXRyYWluLCBjb2xvcl9sYWJlbCA9ICJ5IiwKICAgICAgICBjZW50ZXIgPSBUUlVFLCBzY2FsZSA9IEZBTFNFKSRwbG90CmBgYAoKIyBQcmVkaWN0aW9uIE1vZGVsaW5nCgpUT0RPOiBhZGQgYWR2aWNlIG9uIHdoaWNoIG1vZGVscyB0byBzZWxlY3QgYW5kIHdoeQoKRGlzY3VzcyB0aGUgcHJlZGljdGlvbiBtZXRob2RzIHVuZGVyIGNvbnNpZGVyYXRpb24sIGFuZCBleHBsYWluIHdoeSB0aGVzZSBtZXRob2RzIHdlcmUgY2hvc2VuLgoKYGBge2FzaXMsIGludGVyYWN0aXZlX3RleHQgPSBUUlVFfQoKYGBgCgpEaXNjdXNzIHRoZSBhY2N1cmFjeSBtZXRyaWNzIHVuZGVyIGNvbnNpZGVyYXRpb24sIGFuZCBleHBsYWluIHdoeSB0aGVzZSBtZXRyaWNzIHdlcmUgY2hvc2VuLgoKYGBge2FzaXMsIGludGVyYWN0aXZlX3RleHQgPSBUUlVFfQoKYGBgCgpOb3RlOiB0aGVyZSBzaG91bGQgYmUgbXVsdGlwbGUgbWV0aG9kcyBhbmQgbWV0cmljcyB1bmRlciBjb25zaWRlcmF0aW9uIHRvIHBhaW50IGEgbW9yZSBob2xpc3RpYyBwaWN0dXJlIG9mIHRoZSBkYXRhLiBBdCBsZWFzdCBvbmUgbWV0aG9kIHNob3VsZCBiZSBhIGJhc2VsaW5lLCBjb21tb24gYXBwcm9hY2ggdGhhdCBtYXkgbm90IGJlIG9wdGltYWwgZm9yIHRoZSBwcm9ibGVtIHNldHRpbmcsIGJ1dCBzZXJ2ZXMgYXMgYSBoZWxwZnVsIGNvbXBhcmlzb24uCgojIyBQcmVkaWN0aW9uIGNoZWNrIHsudGFic2V0IC5jdXN0b20tdGFic30KCkNhcnJ5IG91dCB0aGUgcHJlZGljdGlvbiBwaXBlbGluZSwgb3V0bGluZWQgYWJvdmUuCgoxLiBGaXQgcHJlZGljdGlvbiBtZXRob2RzIG9uIHRyYWluaW5nIGRhdGEuCjIuIEV2YWx1YXRlIHByZWRpY3Rpb24gbWV0aG9kcyBvbiB2YWxpZGF0aW9uIGRhdGEuCjMuIENvbXBhcmUgcmVzdWx0cywgYW5kIGZpbHRlciBvdXQgcG9vciBtb2RlbHMuCgpgYGB7YXNpcywgaW50ZXJhY3RpdmVfdGV4dCA9IFRSVUV9CgpgYGAKCmBgYHtyIGNhcmV0LWZpdC1wYXJhbXMsIGV2YWwgPSBwYXJhbXMkbW9kZWxpbmdfcGtnID09ICJjYXJldCIsIGVjaG8gPSBwYXJhbXMkbW9kZWxpbmdfcGtnID09ICJjYXJldCIsIGNhY2hlID0gRkFMU0V9CiMjIElGIFVTSU5HIENBUkVUIE1PREVMSU5HIEJBQ0tFTkQsIENIT09TRSBNRVRIT0RTIEFORCBUUkFJTklORyBDT05UUk9MUyBIRVJFCmN2X29wdGlvbnMgPC0gbGlzdChuZm9sZHMgPSA1LCAKICAgICAgICAgICAgICAgICAgIGZvbGRpZHMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgbWV0cmljID0gIkFjY3VyYWN5IikKCm1vZGVsX2xpc3QgPC0gbGlzdCgKICByYW5nZXIgPSBsaXN0KC50dW5lX3BhcmFtcyA9IGxpc3QobXRyeSA9IHJvdW5kKHNlcShzcXJ0KG5jb2woWHRyYWluKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2woWHRyYWluKSAvIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLm91dCA9IDMpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXRydWxlID0gImdpbmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4ubm9kZS5zaXplID0gMSksCiAgICAgICAgICAgICAgICBpbXBvcnRhbmNlID0gImltcHVyaXR5IiwKICAgICAgICAgICAgICAgIG51bS50aHJlYWRzID0gMSksCiAgeGdiVHJlZSA9IGxpc3QobnRocmVhZCA9IDEpCikKYGBgCgpgYGB7ciBoMm8tZml0LXBhcmFtcywgZXZhbCA9IHBhcmFtcyRtb2RlbGluZ19wa2cgPT0gImgybyIsIGVjaG8gPSBwYXJhbXMkbW9kZWxpbmdfcGtnID09ICJoMm8iLCBjYWNoZSA9IEZBTFNFfQojIyBJRiBVU0lORyBIMk8gTU9ERUxJTkcgQkFDS0VORCwgQ0hPT1NFIE1FVEhPRFMgQU5EIFRSQUlOSU5HIENPTlRST0xTIEhFUkUKcmVxdWlyZShoMm8pCmN2X29wdGlvbnMgPC0gbGlzdChuZm9sZHMgPSA1LAogICAgICAgICAgICAgICAgICAgZm9sZGlkcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICBtZXRyaWMgPSAiYWNjdXJhY3kiKQoKbW9kZWxfbGlzdCA8LSBsaXN0KAogIHJhbmRvbUZvcmVzdCA9IGxpc3QoLnR1bmVfcGFyYW1zID0gbGlzdChtdHJpZXMgPSByb3VuZChzZXEoc3FydChuY29sKFh0cmFpbikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbChYdHJhaW4pIC8gMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aC5vdXQgPSAzKSkpLAogICAgICAgICAgICAgICAgICAgICAgbnRyZWVzID0gNTAwKSwKICB4Z2Jvb3N0ID0gbGlzdCgpCikKCiMgaW5pdGlhbGl6ZSBoMm8gY2x1c3RlcgpoMm8uaW5pdChudGhyZWFkcyA9IC0xKQpgYGAKCmBgYHtyIHRpZHltb2RlbHMtZml0LXBhcmFtcywgZXZhbCA9IHBhcmFtcyRtb2RlbGluZ19wa2cgPT0gInRpZHltb2RlbHMiLCBlY2hvID0gcGFyYW1zJG1vZGVsaW5nX3BrZyA9PSAidGlkeW1vZGVscyIsIGNhY2hlID0gRkFMU0V9CiMjIElGIFVTSU5HIFRJRFlNT0RFTFMgQkFDS0VORCwgQ0hPT1NFIE1FVEhPRFMgQU5EIFRSQUlOSU5HIENPTlRST0xTIEhFUkUKY3Zfb3B0aW9ucyA8LSBsaXN0KG5mb2xkcyA9IDUsCiAgICAgICAgICAgICAgICAgICBmb2xkaWRzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgIG1ldHJpYyA9ICJhY2N1cmFjeSIpCgptb2RlbF9saXN0IDwtIGxpc3QoCiAgcmFuZF9mb3Jlc3QgPSBsaXN0KC50dW5lX3BhcmFtcyA9IGxpc3QobXRyeSA9IHJvdW5kKHNlcShzcXJ0KG5jb2woWHRyYWluKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sKFh0cmFpbikgLyAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLm91dCA9IDMpKSksCiAgICAgICAgICAgICAgICAgICAgIGVuZ2luZSA9IGxpc3QoZW5naW5lID0gInJhbmdlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0YW5jZSA9ICJpbXB1cml0eSIpKSwKICBib29zdF90cmVlID0gbGlzdChlbmdpbmUgPSAieGdib29zdCIpCikKYGBgCgpgYGB7ciBmaXQtbW9kZWxzLCBjbGFzcy5vdXRwdXQ9InNjcm9sbC0zMDAifQojIGZpdC90cmFpbiBtb2RlbHMKZml0X3Jlc3VsdHMgPC0gZml0TW9kZWxzKFh0cmFpbiA9IFh0cmFpbiwgeXRyYWluID0geXRyYWluLAogICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfbGlzdCA9IG1vZGVsX2xpc3QsIGN2X29wdGlvbnMgPSBjdl9vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgdXNlID0gcGFyYW1zJG1vZGVsaW5nX3BrZykKCiMgbWFrZSBwcmVkaWN0aW9uIG9uIHZhbGlkYXRpb24gc2V0CnByZWRfcmVzdWx0cyA8LSBwcmVkaWN0TW9kZWxzKGZpdF9saXN0ID0gZml0X3Jlc3VsdHMsIFh0ZXN0ID0gWHZhbGlkKQoKIyBldmFsdWF0ZSBwcmVkaWN0aW9ucyBvbiB2YWxpZGF0aW9uIHNldApldmFsX3Jlc3VsdHMgPC0gZXZhbHVhdGVNb2RlbHMocHJlZF9kZiA9IHByZWRfcmVzdWx0cywgeXRlc3QgPSB5dmFsaWQpCgojIGNvbGxlY3QgZmVhdHVyZSBpbXBvcnRhbmNlIG1ldHJpY3MgZnJvbSBtb2RlbCBmaXRzCmltcF9yZXN1bHRzIDwtIGludGVycHJldE1vZGVscyhmaXRfbGlzdCA9IGZpdF9yZXN1bHRzKQpgYGAKCgojIyMgRml0IFN1bW1hcnkgey51bm51bWJlcmVkIC50YWJzZXQgLnRhYnNldC1waWxsc30KCmBgYHtyIGZpdC1zdW1tYXJ5LCBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSAiYXNpcyJ9CiMgcHJpbnQgb3V0IGZpdCBvdXRwdXQgc3VtbWFyeQpwcmludEZpdFJlc3VsdHMoZml0X3Jlc3VsdHMpCmBgYAoKIyMjIFByZWRpY3Rpb24gUmVzdWx0cyB7LnVubnVtYmVyZWR9CgpgYGB7ciBwcmVkaWN0aW9uLXJlc3VsdHMsIGVjaG8gPSBGQUxTRSwgcmVzdWx0cyA9ICJhc2lzIn0KIyBkaXNwbGF5IHByZWRpY3Rpb24gbWV0cmljcywgY29uZnVzaW9uIG1hdHJpY2VzLCBhbmQgcm9jL3ByIHBsb3RzIGlmIGFwcGxpY2FibGUKc2hvd0V2YWxSZXN1bHRzKGV2YWxfcmVzdWx0cywgZGlnaXRzID0gMiwgc2lnZmlnID0gRkFMU0UsCiAgICAgICAgICAgICAgICBodG1sX29wdGlvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICBvcHRpb25zID0gbGlzdChkb20gPSAidCIsIHBhZ2VMZW5ndGggPSBucm93KGV2YWxfcmVzdWx0cykpCiAgICAgICAgICAgICAgICApKQpgYGAKCiMjIFN0YWJpbGl0eSBjaGVjayB7LnRhYnNldCAuY3VzdG9tLXRhYnN9CgpUYWtpbmcgdGhlIHByZWRpY3Rpb24gbWV0aG9kcyB0aGF0IHBhc3MgdGhlIHByZWRpY3Rpb24gY2hlY2ssIHBlcmZvcm0gc3RhYmlsaXR5IGFuYWx5c2lzLgoKMS4gU3BlY2lmeSBhbmQganVzdGlmeSB0aGUgYXBwcm9wcmlhdGUgZGF0YSBwZXJ0dXJiYXRpb24ocykuCjIuIFJlLWZpdCB0aGUgcHJlZGljdGlvbiBtZXRob2RzIG9uIHRoZXNlIHBlcnR1cmJlZCBkYXRhIHNldHMuCjMuIEV2YWx1YXRlIHByZWRpY3Rpb24gbWV0aG9kcyBvbiB2YWxpZGF0aW9uIGRhdGEuCjQuIEFzc2VzcyBzdGFiaWxpdHkgYWNyb3NzIHRoZSBkYXRhIHBlcnR1cmJhdGlvbnMgYXMgd2VsbCBhcyBhY3Jvc3MgdGhlIHZhcmlvdXMgbWV0aG9kcy4KNS4gRmlsdGVyIG91dCBwb29yIG1vZGVscyB3aGVyZSBuZWNlc3NhcnkgYW5kIGludGVycHJldCBzdGFiaWxpdHkgcmVzdWx0cy4KCmBgYHthc2lzLCBpbnRlcmFjdGl2ZV90ZXh0ID0gVFJVRX0KCmBgYAoKPCEtLSBUT0RPOiBBbmEgLSBQcm92aWRlIHNvbWUgZXhhbXBsZSBjb2RlIGhlcmUgKGZvciBib3RoIGZpdHRpbmcgYW5kIHZpc3VhbGl6aW5nIHJlc3VsdHMpIHNvIHRoYXQgdGhlIHByYWN0aXRpb25lciBjYW4gZWFzaWx5IGlucHV0IHRoZWlyIGRhdGEgYW5kIG1vZGVscy4gQWRkIHNvbWV0aGluZyBsaWtlIEphbWVzJyBzbGlkZS4gQSBmZXcgcGljdHVyZXMgd2l0aCBwb3NzaWJsZSBkYXRhIHBlcnR1cmJhdGlvbiBzY2hlbWVzIChzZXBhcmF0ZSBmcm9tIHBhcmFtZXRlciB0dW5pbmcpLiBEYXRhIHNwbGl0dGluZyB2cyBzYW1wbGluZyBvZiBvYnNlcnZhdGlvbnMuIENyb3NzLXZhbGlkYXRpb24taXNoIHNjaGVtZSBhbmQgZml4ZWQgdHJhaW5pbmcvdmFsaWRhdGlvbiBzZXR1cCAoYm9vdHN0cmFwcGluZywgc3ViLXNhbXBsaW5nLCBzdHJhdGlmaWVkLXNhbXBsaW5nKS4gQWRkIHBhcmFtZXRlciB0byBpbmNsdWRlL2V4Y2x1ZGUgY2VydGFpbiBjb2RlIGNodW5rcy4gLS0+CgpgYGB7ciBzdGFiaWxpdHktY2hlY2t9Cm5fcmVwcyA8LSAyICMgaW5jcmVhc2UgZm9yIGJldHRlciBzdGFiaWxpdHkgbWVhc3VyZXMgd2hlbiBub3QgdGVzdGluZyBjb2RlCgojIHAgPC0gcHJvZ3Jlc3NyOjpwcm9ncmVzc29yKHN0ZXBzID0gbl9yZXBzKQojIGZ1dHVyZTo6cGxhbihtdWx0aXNlc3Npb24sIHdvcmtlcnMgPSBtaW4obl9yZXBzLCBwYXJhbGxlbDo6ZGV0ZWN0Q29yZXMoKSAtIDEpKQpib290c3RyYXBfbW9kZWxfcmVzdWx0cyA8LSBmdXR1cmUuYXBwbHk6OmZ1dHVyZV9yZXBsaWNhdGUoCiAgbiA9IG5fcmVwcywKICBleHByID0gewogICAgYm9vdHN0cmFwIDwtIHNhbXBsZSgxOm5yb3coWHRyYWluKSwgbnJvdyhYdHJhaW4pLCByZXBsYWNlID0gVFJVRSkKICAgIFh0cmFpbl9iIDwtIFh0cmFpbltib290c3RyYXAsIF0KICAgIHl0cmFpbl9iIDwtIHl0cmFpbltib290c3RyYXBdCiAgICAKICAgICMgZml0L3RyYWluIG1vZGVscyBvbiBib290c3RyYXAgZGF0YQogICAgZml0X3Jlc3VsdHNfYiA8LSBmaXRNb2RlbHMoWHRyYWluID0gWHRyYWluX2IsIHl0cmFpbiA9IHl0cmFpbl9iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfbGlzdCA9IG1vZGVsX2xpc3QsIGN2X29wdGlvbnMgPSBjdl9vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlID0gcGFyYW1zJG1vZGVsaW5nX3BrZykKCiAgICAjIG1ha2UgcHJlZGljdGlvbiBvbiB2YWxpZGF0aW9uIHNldAogICAgcHJlZF9yZXN1bHRzX2IgPC0gcHJlZGljdE1vZGVscyhmaXRfbGlzdCA9IGZpdF9yZXN1bHRzX2IsIFh0ZXN0ID0gWHZhbGlkKQoKICAgICMgZXZhbHVhdGUgcHJlZGljdGlvbnMgb24gdmFsaWRhdGlvbiBzZXQKICAgIGV2YWxfcmVzdWx0c19iIDwtIGV2YWx1YXRlTW9kZWxzKHByZWRfZGYgPSBwcmVkX3Jlc3VsdHNfYiwgeXRlc3QgPSB5dmFsaWQpCiAgICAKICAgICMgY29sbGVjdCBmZWF0dXJlIGltcG9ydGFuY2UgbWV0cmljcyBmcm9tIG1vZGVsIGZpdHMKICAgIGltcF9yZXN1bHRzX2IgPC0gaW50ZXJwcmV0TW9kZWxzKGZpdF9saXN0ID0gZml0X3Jlc3VsdHNfYikKICAgIAogICAgcmV0dXJuKGxpc3QoIyBmaXQgPSBmaXRfcmVzdWx0c19iLCAgIyB1bmNvbW1lbnQgaWYgbmVlZCBib290c3RyYXAgZml0czsgY2FuIGJlIG1lbW9yeSBpbnRlbnNpdmUKICAgICAgICAgICAgICAgIHByZWRpY3Rpb25zID0gcHJlZF9yZXN1bHRzX2IsCiAgICAgICAgICAgICAgICBldmFsX21ldHJpY3MgPSBldmFsX3Jlc3VsdHNfYiwKICAgICAgICAgICAgICAgIGltcG9ydGFuY2VzID0gaW1wX3Jlc3VsdHNfYikpCiAgfSwKICBzaW1wbGlmeSA9IEZBTFNFCikKCmJvb3RzdHJhcF9tb2RlbF9lcnJzIDwtIHB1cnJyOjptYXBfZGZyKGJvb3RzdHJhcF9tb2RlbF9yZXN1bHRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+LngkZXZhbF9tZXRyaWNzJG1ldHJpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pZCA9ICJib290c3RyYXBfaWQiKQpib290c3RyYXBfbW9kZWxfcHJlZHMgPC0gcHVycnI6Om1hcChib290c3RyYXBfbW9kZWxfcmVzdWx0cywgInByZWRpY3Rpb25zIikKYm9vdHN0cmFwX21vZGVsX2ltcHMgPC0gcHVycnI6Om1hcF9kZnIoYm9vdHN0cmFwX21vZGVsX3Jlc3VsdHMsICJpbXBvcnRhbmNlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pZCA9ICJib290c3RyYXBfaWQiKQoKIyBzdW1tYXJpemUgYm9vdHN0cmFwIG1vZGVsIGVycm9yIG1ldHJpY3MKYm9vdHN0cmFwX21vZGVsX2VycnNfc3VtbWFyeSA8LSBib290c3RyYXBfbW9kZWxfZXJycyAlPiUKICB0aWR5cjo6cGl2b3RfbG9uZ2VyKGNvbHMgPSBjKC1ib290c3RyYXBfaWQsIC1NZXRyaWMpLCAKICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIk1ldGhvZCIsIHZhbHVlc190byA9ICJWYWx1ZSIpICU+JQogIGRwbHlyOjpncm91cF9ieShNZXRob2QsIE1ldHJpYykgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShNZWFuID0gbWVhbihWYWx1ZSksIFNEID0gc2QoVmFsdWUpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICB0aWR5cjo6cGl2b3RfbG9uZ2VyKGNvbHMgPSBjKE1lYW4sIFNEKSwgCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiVmFsdWUiLCBuYW1lc190byA9ICJTdGF0aXN0aWMiKSAlPiUKICB0aWR5cjo6cGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9ICJNZXRob2QiLCB2YWx1ZXNfZnJvbSA9ICJWYWx1ZSIpICU+JQogIGRwbHlyOjphcnJhbmdlKE1ldHJpYywgU3RhdGlzdGljKQpgYGAKCiMjIyBUYWJsZSB7LnVubnVtYmVyZWR9CgpgYGB7ciBzdGFiaWxpdHktY2hlY2stdGFibGUsIHJlc3VsdHMgPSAiYXNpcyJ9CiMgdGFibGUgb2YgYWNjdXJhY3kgbWV0cmljcwpwcmV0dHlUYWJsZSgKICBib290c3RyYXBfbW9kZWxfZXJyc19zdW1tYXJ5LCAKICBkaWdpdHMgPSAyLCBzaWdmaWcgPSBGQUxTRSwgcm93bmFtZXMgPSBGQUxTRSwKICBjYXB0aW9uID0gIlZhbGlkYXRpb24gUHJlZGljdGlvbiBBY2N1cmFjaWVzIE92ZXIgQm9vdHN0cmFwcGVkIFRyYWluaW5nIEZpdHMiLCAKICBodG1sX29wdGlvbnMgPSBsaXN0KAogICAgZXh0ZW5zaW9ucyA9ICJSb3dHcm91cCIsCiAgICBvcHRpb25zID0gbGlzdCgKICAgICAgZG9tID0gInQiLAogICAgICBwYWdlTGVuZ3RoID0gbnJvdyhib290c3RyYXBfbW9kZWxfZXJyc19zdW1tYXJ5KSwKICAgICAgc2Nyb2xsWSA9ICI1MDBweCIsCiAgICAgIHJvd0dyb3VwID0gbGlzdChkYXRhU3JjID0gMCksCiAgICAgIGNvbHVtbkRlZnMgPSBsaXN0KGxpc3QoY2xhc3NOYW1lID0gImR0LWNlbnRlciIsIHRhcmdldHMgPSAiX2FsbCIpLAogICAgICAgICAgICAgICAgICAgICAgICBsaXN0KHZpc2libGUgPSBGQUxTRSwgdGFyZ2V0cyA9IDApLAogICAgICAgICAgICAgICAgICAgICAgICBsaXN0KHRpdGxlID0gIk1ldHJpYyIsIHRhcmdldHMgPSAxKSkKICAgICkKICApCikKYGBgCgojIyMgUGxvdCB7LnVubnVtYmVyZWR9CgpgYGB7ciBzdGFiaWxpdHktY2hlY2stYm94cGxvdH0KIyBib3hwbG90cwpib290c3RyYXBfbW9kZWxfZXJycyAlPiUKICB0aWR5cjo6cGl2b3RfbG9uZ2VyKGNvbHMgPSBjKC1ib290c3RyYXBfaWQsIC1NZXRyaWMpLCAKICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIk1ldGhvZCIsIHZhbHVlc190byA9ICJWYWx1ZSIpICU+JQogIHBsb3RCb3hwbG90KHhfc3RyID0gIk1ldGhvZCIsIHlfc3RyID0gIlZhbHVlIikgKwogIGdncGxvdDI6OmZhY2V0X3dyYXAofiBNZXRyaWMpICsKICBnZ3Bsb3QyOjpsYWJzKHRpdGxlID0gIlZhbGlkYXRpb24gUHJlZGljdGlvbiBBY2N1cmFjaWVzIE92ZXIgQm9vdHN0cmFwcGVkIFRyYWluaW5nIEZpdHMiKQpgYGAKCiMjIEludGVycHJldGFiaWxpdHkgey50YWJzZXQgLmN1c3RvbS10YWJzfQoKRm9yIHRoZSBtb2RlbHMgdGhhdCBwYXNzIHRoZSBwcmVkaWN0aW9uIGFuZCBzdGFiaWxpdHkgY2hlY2tzLCBleHRyYWN0IHRoZSBpbXBvcnRhbnQgZmVhdHVyZXMgaW4gdGhlIHByZWRpY3RpdmUgbW9kZWxzIHRoYXQgYXJlIHN0YWJsZSBhY3Jvc3MgYm90aCBkYXRhIGFuZCBtb2RlbCBwZXJ0dXJiYXRpb25zLiBEZXRlcm1pbmluZyB0aGUgaW1wb3J0YW5jZSBvZiBhIGZlYXR1cmUgY2FuIGJlIG1ldGhvZCBkZXBlbmRlbnQuCgpgYGB7YXNpcywgaW50ZXJhY3RpdmVfdGV4dCA9IFRSVUV9CgpgYGAKCiMjIyBGdWxsIE1vZGVsICh3aXRob3V0IHN0YWJpbGl0eSkgey51bm51bWJlcmVkIC50YWJzZXQgLnRhYnNldC1waWxsc30KCiMjIyMgVGFibGUgey51bm51bWJlcmVkfQoKYGBge3IgaW50ZXJwcmV0YWJpbGl0eS10YWJsZSwgYWRkX25ld19saW5lID0gVFJVRSwgcmVzdWx0cyA9ICJhc2lzIn0KcHJldHR5VGFibGUoaW1wX3Jlc3VsdHMsIGRpZ2l0cyA9IDIsIHNpZ2ZpZyA9IEZBTFNFLAogICAgICAgICAgICBjYXB0aW9uID0gIlZhcmlhYmxlIEltcG9ydGFuY2VzIikKYGBgCgojIyMjIFBsb3RzIHsudW5udW1iZXJlZH0KCmBgYHtyIGludGVycHJldGFiaWxpdHktcGxvdCwgYWRkX25ld19saW5lID0gVFJVRX0KcGxvdEZlYXR1cmVJbXBvcnRhbmNlKGltcF9yZXN1bHRzLAogICAgICAgICAgICAgICAgICAgICAgdXNlX3JhbmtpbmdzID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICB1c2VfZmFjZXRzID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aXZlID0gRkFMU0UpCmBgYAoKYGBge3IgaW50ZXJwcmV0YWJpbGl0eS1wYWlyLXBsb3QsIGFkZF9uZXdfbGluZSA9IFRSVUV9CnBsb3RGZWF0dXJlSW1wb3J0YW5jZVBhaXIoaW1wX3Jlc3VsdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlX3JhbmtpbmdzID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdGl2ZSA9IEZBTFNFKQpgYGAKCiMjIyBCb290c3RyYXBwZWQgTW9kZWwgKHdpdGggc3RhYmlsaXR5KSB7LnVubnVtYmVyZWQgLnRhYnNldCAudGFic2V0LXBpbGxzfQoKIyMjIyBUYWJsZSB7LnVubnVtYmVyZWR9CgpgYGB7ciBib290LWludGVycHJldGFiaWxpdHktdGFibGUsIGFkZF9uZXdfbGluZSA9IFRSVUUsIHJlc3VsdHMgPSAiYXNpcyJ9CmJvb3RzdHJhcF9tb2RlbF9pbXBzX3N1bW1hcnkgPC0gYm9vdHN0cmFwX21vZGVsX2ltcHMgJT4lCiAgZHBseXI6Omdyb3VwX2J5KE1ldGhvZCwgVmFyaWFibGUpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UoYE1lYW4gSW1wb3J0YW5jZWAgPSBtZWFuKEltcG9ydGFuY2UpLAogICAgICAgICAgICAgICAgICAgYE1lZGlhbiBJbXBvcnRhbmNlYCA9IG1lZGlhbihJbXBvcnRhbmNlKSwKICAgICAgICAgICAgICAgICAgIGBTRCBJbXBvcnRhbmNlYCA9IHNkKEltcG9ydGFuY2UpLAogICAgICAgICAgICAgICAgICAgYE1pbiBJbXBvcnRhbmNlYCA9IG1pbihJbXBvcnRhbmNlKSwKICAgICAgICAgICAgICAgICAgIGBNYXggSW1wb3J0YW5jZWAgPSBtYXgoSW1wb3J0YW5jZSksIAogICAgICAgICAgICAgICAgICAgLmdyb3VwcyA9ICJrZWVwIikKcHJldHR5VGFibGUoCiAgYm9vdHN0cmFwX21vZGVsX2ltcHNfc3VtbWFyeSwgCiAgZGlnaXRzID0gMiwgc2lnZmlnID0gRiwgCiAgY2FwdGlvbiA9ICJTdW1tYXJ5IG9mIHZhcmlhYmxlIGltcG9ydGFuY2VzIGFjcm9zcyBib290c3RyYXBwZWQgbW9kZWxzIgopCmBgYAoKIyMjIyBQbG90cyB7LnVubnVtYmVyZWR9CgpgYGB7ciBib290LWludGVycHJldGFiaWxpdHktcGxvdCwgYWRkX25ld19saW5lID0gVFJVRX0KcGxvdEZlYXR1cmVJbXBvcnRhbmNlU3RhYmlsaXR5KGJvb3RzdHJhcF9tb2RlbF9pbXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlX3JhbmtpbmdzID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VfZmFjZXRzID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aXZlID0gRkFMU0UpCmBgYAoKIyBNYWluIFJlc3VsdHMKCiMjIHsudW5udW1iZXJlZCAudGFic2V0IC5jdXN0b20tdGFic30KCkludGVycHJldCBhbmQgc3VtbWFyaXplIHRoZSBwcmVkaWN0aW9uIGFuZCBzdGFiaWxpdHkgcmVzdWx0cy4KCmBgYHthc2lzLCBpbnRlcmFjdGl2ZV90ZXh0ID0gVFJVRX0KCmBgYAoKRXZhbHVhdGUgcGlwZWxpbmUgb24gdGVzdCBkYXRhLgoKYGBge3IgZmluYWwtZml0cywgY2xhc3Mub3V0cHV0PSJzY3JvbGwtMzAwIn0KWHRyYWluX2ZpbmFsIDwtIGRwbHlyOjpiaW5kX3Jvd3MoWHRyYWluLCBYdmFsaWQpCnl0cmFpbl9maW5hbCA8LSBjKHl0cmFpbiwgeXZhbGlkKQoKIyBmaXQvdHJhaW4gbW9kZWxzCmZpdF9yZXN1bHRzX2ZpbmFsIDwtIGZpdE1vZGVscyhYdHJhaW4gPSBYdHJhaW5fZmluYWwsIHl0cmFpbiA9IHl0cmFpbl9maW5hbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2xpc3QgPSBtb2RlbF9saXN0LCBjdl9vcHRpb25zID0gY3Zfb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZSA9IHBhcmFtcyRtb2RlbGluZ19wa2cpCgojIG1ha2UgcHJlZGljdGlvbiBvbiB0ZXN0IHNldApwcmVkX3Jlc3VsdHNfZmluYWwgPC0gcHJlZGljdE1vZGVscyhmaXRfbGlzdCA9IGZpdF9yZXN1bHRzX2ZpbmFsLCBYdGVzdCA9IFh0ZXN0KQoKIyBldmFsdWF0ZSBwcmVkaWN0aW9ucyBvbiB0ZXN0IHNldApldmFsX3Jlc3VsdHNfZmluYWwgPC0gZXZhbHVhdGVNb2RlbHMocHJlZF9kZiA9IHByZWRfcmVzdWx0c19maW5hbCwgeXRlc3QgPSB5dGVzdCkKCiMgY29sbGVjdCBmZWF0dXJlIGltcG9ydGFuY2UgbWV0cmljcyBmcm9tIG1vZGVsIGZpdHMKaW1wX3Jlc3VsdHNfZmluYWwgPC0gaW50ZXJwcmV0TW9kZWxzKGZpdF9saXN0ID0gZml0X3Jlc3VsdHNfZmluYWwpCmBgYAoKU3VtbWFyaXplIHRlc3Qgc2V0IHByZWRpY3Rpb24gYW5kL29yIGludGVycHJldGFiaWxpdHkgcmVzdWx0cy4KCmBgYHthc2lzLCBpbnRlcmFjdGl2ZV90ZXh0ID0gVFJVRX0KCmBgYAoKPCEtLSBUT0RPOiBBbmEgLSBhZGQgdGVtcGxhdGUgdGFibGVzIHdpdGggaW50ZXJwcmV0YXRpb24gLS0+CgojIyMgRml0IFN1bW1hcnkgey51bm51bWJlcmVkIC50YWJzZXQgLnRhYnNldC1waWxsc30KCmBgYHtyIGZpbmFsLWZpdC1zdW1tYXJ5LCBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSAiYXNpcyJ9CiMgcHJpbnQgb3V0IGZpdCBvdXRwdXQgc3VtbWFyeQpwcmludEZpdFJlc3VsdHMoZml0X3Jlc3VsdHNfZmluYWwpCmBgYAoKIyMjIFByZWRpY3Rpb24gUmVzdWx0cyB7LnVubnVtYmVyZWR9CgpgYGB7ciBmaW5hbC1wcmVkaWN0aW9uLXJlc3VsdHMsIGVjaG8gPSBGQUxTRSwgcmVzdWx0cyA9ICJhc2lzIn0KIyBkaXNwbGF5IHByZWRpY3Rpb24gbWV0cmljcywgY29uZnVzaW9uIG1hdHJpY2VzLCBhbmQgcm9jL3ByIHBsb3RzIGlmIGFwcGxpY2FibGUKc2hvd0V2YWxSZXN1bHRzKGV2YWxfcmVzdWx0c19maW5hbCwgdGVzdF9zZXQgPSBUUlVFLCBkaWdpdHMgPSAyLCBzaWdmaWcgPSBGQUxTRSwKICAgICAgICAgICAgICAgIGh0bWxfb3B0aW9ucyA9IGxpc3QoCiAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KGRvbSA9ICJ0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VMZW5ndGggPSBucm93KGV2YWxfcmVzdWx0c19maW5hbCkpCiAgICAgICAgICAgICAgICApKQpgYGAKCiMgUG9zdCBob2MgYW5hbHlzaXMKCk1vdmUgYmV5b25kIHRoZSBnbG9iYWwgcHJlZGljdGlvbiBhY2N1cmFjeSBtZXRyaWNzIGFuZCBkaXZlIGRlZXBlciBpbnRvIGluZGl2aWR1YWwtbGV2ZWwgcHJlZGljdGlvbnMgZm9yIHRoZSB2YWxpZGF0aW9uIGFuZC9vciB0ZXN0IHNldCwgaS5lLiwgcHJvdmlkZSBhIG1vcmUgImxvY2FsIiBhbmFseXNpcy4KCi0gICBFeGFtaW5lIGFueSBwb2ludHMgdGhhdCBoYWQgcG9vciBwcmVkaWN0aW9ucy4KLSAgIEV4YW1pbmUgZGlmZmVyZW5jZXMgYmV0d2VlbiBwcmVkaWN0aW9uIG1ldGhvZHMuCgpgYGB7YXNpcywgaW50ZXJhY3RpdmVfdGV4dCA9IFRSVUV9CgpgYGAKCmBgYHtyIHBvc3Rob2MtcGFpci1wbG90fQpwcmVkX3Jlc3VsdHNfZmluYWwgJT4lCiAgZHBseXI6Om11dGF0ZSguaWQgPSByZXAoMTpucm93KFh0ZXN0KSwgbGVuZ3RoLm91dCA9IGRwbHlyOjpuKCkpKSAlPiUKICB0aWR5cjo6cGl2b3Rfd2lkZXIoaWRfY29scyA9IC5pZCwgCiAgICAgICAgICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSAiTWV0aG9kIiwgdmFsdWVzX2Zyb20gPSAicHJlZGljdGlvbnMiKSAlPiUKICBkcGx5cjo6bXV0YXRlKGBUcnVlIFJlc3BvbnNlc2AgPSB5dGVzdCkgJT4lCiAgcGxvdFBhaXJzKGNvbHVtbnMgPSAyOihsZW5ndGgodW5pcXVlKHByZWRfcmVzdWx0c19maW5hbCRNZXRob2QpKSArIDIpLAogICAgICAgICAgICB0aXRsZSA9ICJDb21wYXJpc29uIG9mIG1vZGVsIHRlc3QgcHJlZGljdGlvbnMiKQpgYGAKCiMgQ29uY2x1c2lvbnMKClJlaXRlcmF0ZSBtYWluIGZpbmRpbmdzLCBub3RlIGFueSBjYXZlYXRzLCBhbmQgY2xlYXJseSB0cmFuc2xhdGUgZmluZGluZ3MvYW5hbHlzaXMgYmFjayB0byB0aGUgZG9tYWluIHByb2JsZW0gY29udGV4dC4KCmBgYHthc2lzLCBpbnRlcmFjdGl2ZV90ZXh0ID0gVFJVRX0KCmBgYAoK